/*
变量定义后必须使用
同一个作用域变量不能重复声明
a := "" 这种写法只能放在局部作用域。 方法中的是局部 方法外的是全局
代码风格
每一行后面不要分号
等号左右两边加空格
强制代码风格
if xxx { 注意右括号不能放下面

}
go fmt main.go 格式化代码 或者 装完插件保存就自动格式化了
*/
package main

func jmp() (int, string) {
	return 1, "aaa"
}

/**
* 常量
 */
func Consts() {
	// 定义使用const
	// 常量定义后必须先赋值否则后面没机会赋值
	// const PI = 3.14
	// fmt.Print(PI)

	// 声明多个常量和声明多个变量同
	// const a, b int = 1, 2
	// fmt.Print(a, b)

	// const (
	// 	a = 1
	// 	b = "admin"
	// )
	// fmt.Print(a, b)

	// 如果声明常量只有第一个赋值，其余的省略值，默认和上一个有值的值相同。
	// const (
	// 	a = 1
	// 	b
	// 	c
	// 	d
	// )
	// fmt.Print(a, b, c, d)  // 1 1 1 1

	// 常量计数器 iota 只是结合const使用的，如果指定常量的值是iota值是0 后面的常量如果没有赋值默认就是上一个没有付值的值+1
	// cons t (
	// 	a = iota
	// 	b
	// 	c
	// 	d
	// )
	// fmt.Print(a, b, c, d)

	// const iota跳过不想要的值
	// const (
	// 	a = iota
	// 	_ // 跳过1
	// 	b
	// 	c
	// 	d
	// )
	// fmt.Print(a, b, c, d)

	// 断开继续iota
	// const (
	// 	a = iota
	// 	b = 100
	// 	_
	// 	d = iota
	// 	e
	// )
	// fmt.Print(a, b, d, e) // 0 100 3 4 d 延续iota上次断开的值继续开始 0 100断开 _ 2 d 恢复iota3 4

	// const (
	// 	a = iota + 1 // iota 0
	// 	b = iota + 2 // iota 1
	// )
	// fmt.Print(a, b) // 1 3

	// iota在第一行永远是0 分行出现递增  但后面没有iota的按照原来递增
	// 一行
	// const (
	// 	a, b = iota + 1, iota + 2 // 1 2 iota在第一永远是0
	// 	c, d                      // 他们按照原有iota的规则 上面出现2次 所以 c 2 d 3
	// )
	// fmt.Print(a, b, c, d)

	// iota分行
	// const (
	// 	a = iota + 1
	// 	b = iota + 100
	// 	c
	// 	d
	// )
	// fmt.Print(a, b, c, d) // 这个c是基于b的值累加

	// 总结iota出现几次累计多少 当时都在第一行都是相同值0 后面的值 还是数iot的个数  中间被打断再出现iota继续
	// 被d=100打断所以e就是100没有iota恢复就这样了
	// const (
	// 	a = iota
	// 	b
	// 	c
	// 	d = 100
	// 	e
	// )
	// fmt.Print(a, b, c, d, e)

}

func main() {
	/*
		声明变量的方式
	*/
	// var 变量名称 类型 = 值
	// var sqx int = 1
	// fmt.Print(sqx)

	// var a = "111" 推荐写法

	// var a string
	// a = "aaaa"

	// a := "111"

	// 一次声明多个变量
	// var (
	// 	a string = "aa "
	// 	b int    = 111
	// )

	// var a, b string = "aa", "bb" 这种一次声明多个变量没法不同类型
	// var a int,b string = 1,"aa" 这是错误写法

	// var a, b string
	// a = "aaa"
	// b = "bbb"

	// var (
	// 	a string
	// 	b int
	// )
	// a = "aaa"
	// b = 2

	// var (
	// 	a = "aaa"
	// 	b = "bbb"
	// )

	// 短变量一次声明多个变量
	// a, b := "admin", 123

	// 匿名变量
	// 就是函数如果返回多个值可以不接收，用_跳过  不接收第一个值 函数返回几个值就必须接收几个值不接全了报错所以用_跳过去，匿名变量不占用空间不存在重复声明。
	// _, a := jmp()

	// 基础类型的默认值
	// var a byte    // 0
	// var b int     // 0
	// var c float32 // 0
	// var d string  // ""
	// var e bool    // false
	// fmt.Printf("%v,%v,%v,%v,%v", a, b, c, d, e)

	// fmt.Print(a, b)

	// 常量
	Consts()
}
